【.NET C#】動作するCPU(プロセッサー)を指定してアプリを起動させる。その2
前回の続きです。
maasasa.hatenablog.com
次は子プロセスを作成します。
現在のソリューションの状態、プロジェクトは前回作成した1つのみです。
ソリューションエクスプローラーのソリューションを右クリックで表示されるメニューから、
追加 > 新しいプロジェクト > WPFアプリ を選びます。名前はProcessAとします。
同様の手順でProcessBプロジェクトも作成します。
こんな感じで3つのプロジェクトが作成できていると思います。
下記コードです、ProcessAとBで名前空間などプロジェクト依存部分以外は共通です。
MainWindow.xaml
<Window x:Class="ProcessA.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ProcessA" mc:Ignorable="d" Title="MainWindow" Height="158.824" Width="325"> <Grid> <Label Content="動作プロセッサ設定値は" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/> <Label Name="TargetProcessor" Content="x" HorizontalAlignment="Left" Margin="167,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="2.695,0.538"/> <Label Content="です" HorizontalAlignment="Left" Margin="196,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="2.695,0.538"/> </Grid> </Window>
MainWindow.xaml.cs
using System.Diagnostics; using System.Windows; namespace ProcessA { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Title = "ProcessA"; //自身の動作CPUを取得する。 var processor = Process.GetCurrentProcess().ProcessorAffinity.ToInt32(); this.TargetProcessor.Content = processor.ToString(); } } }
ではソリューションをビルドしてアプリを起動します。
アプリが起動したらボタンを押下してProcessAとProcessBを起動します。
起動しました。指定したプロパティ値は効いてるようなのでタスクマネージャーで動作CPUを確認します。
タスクマネージャーでアプリを選択して右クリックで表示されるメニューの「詳細の表示」をクリックします。
詳細タブでアプリを選択して「関係の設定」を表示します。
意図したCPUで動作していることが確認できました。
C#は本当に使いやすいライブラリが用意されていると思います。
こんなに簡単に動作コアを指定できるとは思いませんでした!
【.NET C#】動作するCPU(プロセッサー)を指定してアプリを起動させる。その1
仕事が色々立て込みまして、かなり久しぶりの更新になってしまいました。
今回は動作するCPUのコアを指定して、他のプロセスを起動するアプリを作成してみようと思います。
まず使用しているCPUのコア数を確認。 Win8 or 10なら「Winキー+Q」のアプリ検索で「システム情報」と入力して下記画面を表示して確認。 コア数4のスレッド数8のようです。
.NET標準のProcessクラスで簡単にできる、、、!
Win32とか使うと思ってたので用意してくれていると助かります。
ProcessThread.ProcessorAffinity プロパティ (System.Diagnostics)
今回は親プロセス(起動指示を出すアプリ)にCPU1、 子プロセスAにCPU2、子プロセスBにCPU3を割り当てようと思います。
WPFで作成しました。(コードビハインドですみません)
まず親プロセス
MainWindow.xaml
<Window x:Class="ProcessStartupApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ProcessStartupApp" mc:Ignorable="d" Title="MainWindow" Height="158.824" Width="325"> <Grid> <Label Content="動作プロセッサ設定値は" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/> <Label Name="TargetProcessor" Content="x" HorizontalAlignment="Left" Margin="167,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="2.695,0.538"/> <Label Content="です" HorizontalAlignment="Left" Margin="196,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="2.695,0.538"/> <Button Name="Button1" Click="Button1_Click" Content="プロセスA起動" HorizontalAlignment="Left" Margin="10,70,0,0" VerticalAlignment="Top" Width="80"/> <Button Name="Button2" Click="Button2_Click" Content="プロセスB起動" HorizontalAlignment="Left" Margin="109,70,0,0" VerticalAlignment="Top" Width="80"/> </Grid> </Window>
MainWindow.xaml.cs
using System; using System.Diagnostics; using System.Windows; namespace ProcessStartupApp { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //自身をCPU1で動作させる。 Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1; //自身の動作CPUを取得する。 var processor = Process.GetCurrentProcess().ProcessorAffinity.ToInt32(); this.TargetProcessor.Content = processor.ToString(); } private void Button1_Click(object sender, RoutedEventArgs e) { var path = @"..\..\..\ProcessA\bin\Debug\ProcessA.exe"; var processor = 2; //CPU2を指定して起動する。 bootingProcess(path, processor); } private void Button2_Click(object sender, RoutedEventArgs e) { var path = @"..\..\..\ProcessB\bin\Debug\ProcessB.exe"; //プロパティ値に3を指定すると、1または2のCPUを使用する。 var processor = 4; //CPU3を指定して起動する。 bootingProcess(path, processor); } private bool bootingProcess(string path, int processor) { try { using (Process p = new Process()) { p.StartInfo.FileName = path; var isBoot = p.Start(); //動作するCPUを指定 p.ProcessorAffinity = (IntPtr)processor; return isBoot; } } catch { return false; } } } }
次に子プロセスを別プロジェクトで作成します。
記事が長くなってきたので次の記事に分割します。
maasasa.hatenablog.com
Windows10上でCentOS7の仮想環境を構築(CentOSインストール編)
前回の記事でWindows10へのVMWareインストールと、仮想マシン作成までを行いました。
maasasa.hatenablog.com
今回は仮想マシン上にCentOS7のインストールをしていきます。
LinuxOSのインストール
前回記事までの設定が終わったら下記画面のような状態になっていると思うので、
「仮想マシンの再生」をクリックして仮想マシンの電源を入れてください。
いきなりなんか出た、、、
このダイアログが出た場合の対処法は別記事で纏めましたので、
参考にしてください。
maasasa.hatenablog.com
上記の設定も終わり起動したところ、また別の下記のエラーが出ました。
ISOLINUX 4.05 2011-12-09 ETCD Copyright (C) 1994-2011 H. Peter Anvin et al
EDD: Error 8000 reading sector 2018812
No DEFAULT or UI configuration directive found!
boot:
4GBあるはずのディスクイメージが1GBちょっとしかない、、、
ちゃんとダウンロードできていなかったようなので再度ダウンロードします。
ディスクイメージをダウンロードし直して、同様の設定をしました。
今度は問題なく起動したので進めていきます。
このような感じでインストールプロセスが進みます。
日本語を選択し、続行ボタンを押下
インストール先を選択
完了ボタンを押下
ソフトウェアの選択を選択
GNOME Desktopにチェックをいれて完了ボタンを押下
インストールの開始を押下
ROOTパスワードを選択
任意のrootパスワードを各入力ボックスに入力
このようにパスワードが短いと完了ボタンを2度押さないいけません。
ユーザの作成を選択
任意のユーザ名とパスワードを入力(キャプチャは例で適用なユーザ名にしています)
インストール完了まで待機
インストールが完了後に表示される再起動ボタンを押下
LICENSE INFORMATIONを選択
ライセンス契約に同意します。にチェックを入れ完了ボタン押下
設定の完了ボタンを押下
ログイン画面が出てくるので前の手順で登録したユーザとパスワードを入力します。
日本語を選択、オンラインアカウントの設定などはスキップしました。
セットアップ完了画面
OSのセットアップはこれで完了です。
次回以降は初期設定とミドルウェアをいれていきたいと思います。
内容に誤りやご質問があればコメント頂けると幸いです。
Windows10上でCentOS7の仮想環境を構築(VMインストールと仮想マシン作成編)
サーバーを建てて試したい事ができたので、
クラウド使うのもいいですが前からやってみようと思っていたVMWareに
Linux(CentOS7)をインストールしてWebサーバーとして使えるようにしてみたいと思います。
環境としては以下の通りです。
ホストOS:Windows10 Pro 64bit
仮想化ソフトウェア:VMWare Workstation 12.5.2 Player
仮想環境OS:CentOS7
VMWareのセットアップ
Windows10で使えるVMWareのセットアップファイルを以下からダウンロードします。
https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/12_0
カスタム セットアップの拡張キーボードドライバにはチェックを入れましょう。
CentOS7のインストールイメージファイル取得
CentOS7のインストールディスクのイメージファイル(CentOS-7-x86_64-DVD-1611.isoのような名前のファイル)を以下からダウンロードします。
(2017/1/17時点 リンク切れてたら「CentOS iso」なんかで調べてください)
http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
4GB以上あるので時間がかかります。
VMWareに仮想マシンの作成
起動したらアドレスの入力や、宣伝などスキップすると下記の画面が出るので、
「新規仮想マシンの作成」をクリックします。
下記の画面が表示されるので「後でOSをインストール」を選択します。
「インストーラディスクイメージファイル」を選択すると簡易インストールになってしまい
パッケージ構成など自由が利かないので選択しません。
LinuxのCentOSを選択し仮想マシン名と保存場所を指定します。
ディスク領域は多めに60GBにしました、現在仕事で使っているVMが40GBで足りなくなって困っているので怖くて、、、
メモリは2GB割り当て、プロセッサは2にしました。
大事なのが「CD/DVD」の設定で「起動時に接続」にチェックを入れ、
「ISOイメージファイルを使用する」を選択し、ダウンロードしたCentOS7のisoファイルを参照してください。
記事が長くなってきたので、
以降のLinuxOSのインストールは別記事に纏めました。
内容に誤りやご質問があればコメント頂けると幸いです。
VMWare仮想マシン起動時に「Device/Credential Guard には互換性がありません。」のエラー解決
VMの設定を記事に纏めていたら表題のエラーが出たので対応しました。
エラーの内容は下記のとおりです。
VMware Player と Device/Credential Guard には互換性がありません。VMware Player は Device/Credential Guard を無効にした後で実行することができます。
詳細については、http://www.vmware.com/go/turnoff_CG_DG を参照してください。
ダイアログに表示されているURLへ飛ぶと下記のResolutionが原因とのこと。
大体手順としてはこんな感じでしょうか。
Itaniumベースのコンピュータの場合
- 1.グループポリシーのCredential Guardを無効にする
- a.スタートボタン > ファイル名を指定して実行で「gpedit.msc」と入力して、ローカルグループポリシー編集画面を開く
- b.ローカルコンピューターポリシー > コンピューターの構成 > 管理用テンプレート > システム > Device Guard > 仮想化ベースのセキュリティを有効にするを選択、ポリシー設定の変種をクリック
- c.表示されるダイアログの無効を選択し適用ボタンを押す
- 2.コントロールパネル > プログラムと機能 > Windowsの機能の有効化または無効化 > 「Hyper -V」と「Hyper -V 管理ツール」のチェックを外します。
- 3.再起動を促されますが、ここでは再起動しません。
- 4.管理者アカウントでコマンドプロンプトを起動して、次のコマンドで関連するEFI変数を削除します。
- 5.再起動します。
- 6.起動画面でDevice GuardまたはCredential Guardを無効にするか聞かれるので説明に従ってキーを押しましょう。
copy %WINDIR%\System32\SecConfig.efi X:\EFI\Microsoft\Boot\SecConfig.efi /Y bcdedit /create {0cb3b571-2f2e-4343-a879-d86a476d7215} /d "DebugTool" /application osloader bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} path "\EFI\Microsoft\Boot\SecConfig.efi" bcdedit /set {bootmgr} bootsequence {0cb3b571-2f2e-4343-a879-d86a476d7215} bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} loadoptions DISABLE-LSA-ISO,DISABLE-VBS bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} device partition=X: mountvol X: /d
注:Xが未使用のドライブであることを確認してください。そうでない場合は、別のドライブに変更してください。
とのことなので上記コマンドでXドライブにマウントしてしまう前に確認してみてください。
レガシーBIOSブートを備えたマシンの場合
1.コマンドプロンプトをホスト上の管理者として開きます。
2.次のコマンドを実行します。
bcdedit /set hypervisorlaunchtype off注;EFIまたはBIOSを検索するには、[実行]タブでmsinfo32.exeと入力します。
私の環境では「Itaniumベースのコンピュータの場合」の手順を実施してHyper -Vを無効にしたらVMWareの仮想マシンを起動できるようになりました。