文档库 最新最全的文档下载
当前位置:文档库 › C#进程注入

C#进程注入

C#进程注入
C#进程注入

C#进程注入

使用CreateRemoteThread和LoadLibrary技术的步骤如下:

1.得到远程进程的HANDLE(使用OpenProcess)。

2.在远程进程中为DLL文件名分配内存(VirtualAllocEx)。

3.把DLL的文件名(全路径)写到分配的内存中(WriteProcessMemory)

4.使用CreateRemoteThread和LoadLibrary把你的DLL映射近远程进程。

5.等待远程线程结束(WaitForSingleObject),即等待LoadLibrary返回。也就是说当我们的DllMain(是以DLL_PROCESS_ATTACH为参数调用的)返回时远程线程也就立即结束了。

6.取回远程线程的结束码(GetExitCodeThtread),即LoadLibrary的返回值――我们DLL 加载后的基地址(HMODULE)。

7.释放第2步分配的内存(VirtualFreeEx)。

8.用CreateRemoteThread和FreeLibrary把DLL从远程进程中卸载。调用时传递第6步取得的HMODULE给FreeLibrary(通过CreateRemoteThread的lpParameter参数)。

9.等待线程的结束(WaitSingleObject)。

10.采用C++/CLI编写:

// InjectDll.h

#pragma once

#include

using namespace System;

namespace InjectDll {

public ref class InjectDllManager

{

public:

// szLibPath - 要加载的Dll,hProcess - 被加载的远程进程,iLibPathSize-要加载的Dll的名称的长度

void InjectLib2Process(char szLibPath[],HANDLE hProcess,int iLibPathSize)

{

HANDLE hThread;

void* pLibRemote;

DWORD hLibModule;//已加载的DLL的基地址(HMODULE);

HMODULE hKernel32 = GetModuleHandle(L"Kernel32");

//初始化szLibPath

//

// 1. 在远程进程中为szLibPath 分配内存

// 2. 写szLibPath到分配的内存

pLibRemote = VirtualAllocEx( hProcess, NULL, iLibPathSize,

MEM_COMMIT, PAGE_READWRITE );

WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath,

sizeof(szLibPath), NULL );

// 加载"szLibPath.dll" 到远程进程

// (通过CreateRemoteThread & LoadLibrary)

hThread = CreateRemoteThread( hProcess, NULL, 0,

(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32, "LoadLibraryA" ),pLibRemote, 0, NULL );

WaitForSingleObject( hThread, INFINITE );

//取得DLL的基地址

GetExitCodeThread( hThread, &hLibModule );

//扫尾工作

CloseHandle( hThread );

VirtualFreeEx( hProcess, pLibRemote, iLibPathSize, MEM_RELEASE );

// 从目标进程卸载LibSpu.dll

// (通过CreateRemoteThread & FreeLibrary)

hThread = CreateRemoteThread( hProcess, NULL, 0,

(LPTHREAD_START_ROUTINE)

GetProcAddress( hKernel32,"FreeLibrary" ),(void*)hLibModule, 0, NULL ); WaitForSingleObject( hThread, INFINITE );

// 扫尾工作

CloseHandle( hThread );

}

};

}

生成Dll,然后在C#项目中将它引用进来,最后编写:

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

InjectDll.InjectDllManager iManager = new InjectDll.InjectDllManager();

iManager.InjectLib2Process(.);

//

}

}

C#进程注入,模拟注入一个记事本

C#中的DLL注入

事实上dll注入很简单,无非就是调用

virtualAllocEx,WriteProcessMemory,OpenProcess,CreateRemoteThread等API函数,因为我是学c#的,所以也想看一下c#这方面的文章,但在网上找了半天,没有找到一篇,也许是c#刚兴起的缘故,学c#的并不多,没办法,只好自己移植一下,因为凡是用到API函数,所有的编程的语言都是相同的,这就为我们的移植带来了方便,学c#的一般应该对API的调用概念很淡,因为c#通常不会去调用API函数,因为这些已经被封装了,在vb,vc++等语言中要结束一个进程,首先就必须要得到这个进程的句柄,然后才能进行相应的关闭进程等操作,得到句柄要用到OpenProcess API函数,结束进程要用到TerminateProcess API 函数,但是在c#中你根本不需要知道这些API函数就能完成同样的功能,所以你要是想了解一下API的相关知识,学一点vb是一个很好的选择。好了!下面就开始我们的c# dll注入之旅吧!

首先需要加入以下API函数:

[DllImport("kernel32.dll")]

public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);

[DllImport("kernel32.dll")]

public static extern int WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );

[DllImport("kernel32.dll")]

public static extern int GetProcAddress(int hwnd, string lpname);

[DllImport("kernel32.dll")]

public static extern int GetModuleHandleA(string name);

[DllImport("kernel32.dll")]

public static extern int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);

C#声明API比较复杂,因为是调用非托管的dll,所以要用到DllImport来调用非托管的dll,他还有很多属性在这就不多说了,网上有很介绍,可以去查一下,不过c#调用自身的变得动态链接库是倒是很方便,直接加个引用就ok了,调用dll要用的一个引用:using System.Runtime.InteropServices;这个不要忘了加上,下面是编好的所有代码:

using System;

using System.Collections.Generic;

using https://www.wendangku.net/doc/1218196425.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Diagnostics;

namespace dllinject

{

public partial class Form1 : Form

{

[DllImport("kernel32.dll")] //声明API函数

public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);

[DllImport("kernel32.dll")]

public static extern int WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );

[DllImport("kernel32.dll")]

public static extern int GetProcAddress(int hwnd, string lpname);

[DllImport("kernel32.dll")]

public static extern int GetModuleHandleA(string name);

[DllImport("kernel32.dll")]

public static extern int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

int ok1;

//int ok2;

//int hwnd;

int baseaddress;

int temp=0;

int hack;

int yan;

string dllname;

dllname = "c:\\dll.dll";

int dlllength;

dlllength = dllname.Length + 1;

Process[] pname = Process.GetProcesses(); //取得所有进程

foreach (Process name in pname) //遍历进程

{

//MessageBox.Show(name.ProcessName.ToLower());

if (name.ProcessName.ToLower().IndexOf("notepad") != -1) //所示记事本,那么下面开始注入

{

baseaddress = VirtualAllocEx(name.Handle, 0, dlllength , 4096, 4); //申请内存空间

if (baseaddress == 0) //返回0则操作失败,下面都是

{

MessageBox.Show("申请内存空间失败!!");

Application.Exit();

}

ok1 = WriteProcessMemory(name.Handle, baseaddress, dllname, dlllength, temp); //写内存

if (ok1 == 0)

{

MessageBox.Show("写内存失败!!");

Application.Exit();

}

hack = GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA"); //取得loadlibarary在kernek32.dll地址

if (hack == 0)

{

MessageBox.Show("无法取得函数的入口点!!");

Application.Exit();

}

yan = CreateRemoteThread(name.Handle, 0, 0, hack, baseaddress, 0, temp); //创建远程线程。

if (yan == 0)

{

MessageBox.Show("创建远程线程失败!!");

Application.Exit();

}

else

{

MessageBox.Show("已成功注入dll!!");

}

}

}

}

}

C#如何:使用MessageWindow 类来响应Windows的消息

.NET Compact Framework 提供MessageWindow 和Message 类以生成和接收基于Windows 的消息。MessageWindow 类使用本机代码以及窗体的句柄创建一个窗口,并执行所需的平台调用来调用本机Windows 函数。MessageWindow 类仅在 .NET Compact Framework 中提供。

请使用消息窗口的窗口句柄Hwnd 向消息窗口发送Windows 消息。您可以使用托管代码中的Create 或使用应用程序中的本机控件生成消息。您只能接收您生成的消息。不能使用MessageWindow 监视操作系统消息。

当消息窗口检测到特定消息时,它将使用WndProc 方法通知窗体,这样您就能提供代码来响应基于Windows 的消息。

此示例演示MessageWindow 的功能,但是没有使用本机组件进行演示。当鼠标指针处于自定义控件或Panel 控件中的Rectangle 内时,它向一个窗体发送包含当前指针的x 和y 坐标的Windows 消息。自定义控件在体上显示为一个框。这两个控件都使用OnMouseMove 方法发送消息。这些消息包含x 坐标和y 坐标。该窗体通过更新标签(使用当前x 坐标和y 坐标)和发送消息的控件来响应用户定义的WM_BOXUPDATE 和WM_PNLUPDATE 消息。

当鼠标位于框和面板之外时,窗体的OnMouseMove 方法在窗体的上下文中使用x 坐标和y 坐标来更新标签。

using System;

using System.Windows.Forms;

using Microsoft.WindowsCE.Forms;

namespace MsgWindow

{

public class MessageWindowForm : System.Windows.Forms.Form

{

private System.Windows.Forms.MainMenu mainMenu1;

// Create an instance of MsgWindow, a derived MessageWindow class.

MsgWindow MsgWin;

public MessageWindowForm()

{

InitializeComponent();

// Create the message window using this form for its constructor. this.MsgWin = new MsgWindow(this);

}

protected override void Dispose( bool disposing )

{

base.Dispose( disposing );

}

#region Windows Form Designer generated code

private void InitializeComponent()

{

this.mainMenu1 = new System.Windows.Forms.MainMenu(); this.Menu = this.mainMenu1;

this.Text = "Message Window Test";

}

#endregion

static void Main()

{

Application.Run(new MessageWindowForm());

}

// Process taps to generate messages

// with the WParam and LParam parameters

// using the X and Y mouse coordinates.

protected override void OnMouseMove(MouseEventArgs e)

{

Message msg = Message.Create(MsgWin.Hwnd,

MsgWindow.WM_CUSTOMMSG,

(IntPtr)e.X,

(IntPtr)e.Y);

MessageWindow.SendMessage(ref msg);

base.OnMouseMove(e);

}

// This callback method responds to the Windows-based message. public void RespondToMessage(int x, int y)

{

this.Text = "X = " + x.ToString() + ", Y= " + y.ToString();

}

}

// Derive MessageWindow to respond to

// Windows messages and to notify the

// form when they are received.

public class MsgWindow : MessageWindow

{

// Assign integers to messages.

// Note that custom Window messages start at WM_USER = 0x400. public const int WM_CUSTOMMSG = 0x0400;

// Create an instance of the form.

private MessageWindowForm msgform;

// Save a reference to the form so it can

// be notified when messages are received.

public MsgWindow(MessageWindowForm msgform)

{

this.msgform = msgform;

}

// Override the default WndProc behavior to examine messages. protected override void WndProc(ref Message msg)

{

switch(msg.Msg)

{

// If message is of interest, invoke the method on the form that

// functions as a callback to perform actions in response to the message.

case WM_CUSTOMMSG:

this.msgform.RespondToMessage((int)msg.WParam, (int)msg.LParam);

break;

}

// Call the base WndProc method

// to process any messages not handled.

base.WndProc(ref msg);

}

}

}

编译代码

第二章进程管理答案

第二章进程管理 一、单项选择题 1、顺序程序和并发程序的执行相比,()。 A.基本相同 B. 有点不同 C.并发程序执行总体上执行时间快 D.顺序程序执行总体上执行时间快 2、在单一处理机上,将执行时间有重叠的几个程序称为()。 A.顺序程序 B. 多道程序 C.并发程序 D. 并行程序 3、进程和程序的本质区别是()。 A.存储在内存和外存 B.顺序和非顺序执行机器指令 C.分时使用和独占使用计算机资源 D.动态和静态特征 4、在下列特性中,不是进程的特性的是()。 A. 异步性 B. 并发性 C. 静态性 D. 动态性 5 A 6 A. 7 A. 8 A. 9 A. 10 A. 11 A. 12。 A. 13 A. 14 A. 15 A. 16、在操作系统中,对信号量S的P原语操作定义中,使进程进入相应阻塞队列等待的条件是()。 A. S>0 B. S=0 C. S<0 D. S≠0 17、信号量S的初值为8,在S上执行了10次P操作,6次V操作后,S的值为()。 A.10 B.8 C.6 D.4 18、在进程通信中,使用信箱方式交换信息的是()。 A.低级通信B.高级通信C.共享存储器通信D.管道通信 19.( )必定会引起进程切换。A.一个进程被创建后进入就绪态B.一个进程从运行态变成等待态c.一个进程从运行态变成就绪态 D.一个进程从等待态变成就绪态 20、操作系统使用( )机制使计算机系统能实现进程并发执行,保证系统正常工作。 A.中断B.查询c.同步D互斥 21.对于一个单处理器系统来说,允许若干进程同时执行,轮流占用处理器.称它们为()的。 A.顺序执行 B.同时执行c.并行执行D.并发执行

操作系统第二章进程和线程复习题

第二章练习题 一、单项选择题 1.某进程在运行过程中需要等待从磁盘上读入数据,此时该进程的状态将( C )。 A. 从就绪变为运行; B.从运行变为就绪; C.从运行变为阻塞; D.从阻塞变为就绪 2.进程控制块是描述进程状态和特性的数据结构,一个进程( D )。 A.可以有多个进程控制块; B.可以和其他进程共用一个进程控制块; C.可以没有进程控制块; D.只能有惟一的进程控制块。 3.临界区是指并发进程中访问共享变量的(D)段。 A、管理信息 B、信息存储 C、数 据 D、程序 4. 当__ B__时,进程从执行状态转变为就绪状态。 A. 进程被调度程序选中 B. 时间片到 C. 等待某一事件 D. 等待的事件发生 5. 信箱通信是一种( B )通信方式。 A. 直接通信 B. 高级通信 C. 低级通信 D. 信号量 6. 原语是(B)。

A、一条机器指令 B、若干条机器指令组成 C、一条特定指令 D、中途能打断的指令 7. 进程和程序的一个本质区别是(A)。 A.前者为动态的,后者为静态的; B.前者存储在内存,后者存储在外存; C.前者在一个文件中,后者在多个文件中; D.前者分时使用CPU,后者独占CPU。 8. 任何两个并发进程之间存在着(D)的关系。 A.各自完全独立B.拥有共享变量 C.必须互斥D.可能相互制约 9. 进程从运行态变为等待态可能由于(B )。 A.执行了V操作 B.执行了P操作 C.时间片用完 D.有高优先级进程就绪 10. 用PV操作管理互斥使用的资源时,信号量的初值应定义为(B)。 A.任意整数 B.1 C.0 D.-1 11. 现有n个具有相关临界区的并发进程,如果某进程调用P操作后变为等待状态,则调用P操作时信号量的值必定为(A)。 A.≤0 B.1 C.n-1 D.n

(完整版)操作系统第二章课后答案

第二章进程管理 2. 试画出下面4条语句的前趋图: S2: b:=z+1; S3: c:=a-b; S4: w:=c+1; 3. 程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作, 致使在这些并发执行的进程之间,形成了相互制约的关系,从而也就使得进程在执行期间出现间断性。 4. 程序并发执行时为什么会失去封闭性和可再现性? 因为程序并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态是 由多个程序来改变,致使程序的运行失去了封闭性。而程序一旦失去了封闭性也会导致其再失去可再现性。 5. 在操作系统中为什么要引入进程概念?它会产生什么样的影响? 为了使程序在多道程序环境下能并发执行,并能对并发执行的程序加以控制和描述,从而在操作系统中引入了进程概念。 影响: 使程序的并发执行得以实行。 6. 试从动态性,并发性和独立性上比较进程和程序? a. 动态性是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到资源 而暂停执行,以及由撤销而消亡,因而进程由一定的生命期;而程序只是一组有序指令的集合,是静态实体。 b. 并发性是进程的重要特征,同时也是OS的重要特征。引入进程的目的正是为了使其 程序能和其它建立了进程的程序并发执行,而程序本身是不能并发执行的。 c. 独立性是指进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和 独立调度的基本单位。而对于未建立任何进程的程序,都不能作为一个独立的单位来运行。 7. 试说明PCB的作用?为什么说PCB是进程存在的唯一标志? a. PCB是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB中记录了操 作系统所需的用于描述进程情况及控制进程运行所需的全部信息。因而它的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能和其它进程并发执行的进程。 b. 在进程的整个生命周期中,系统总是通过其PCB对进程进行控制,系统是根据进程 的PCB而不是任何别的什么而感知到该进程的存在的,所以说,PCB是进程存在的唯一标志。 8. 试说明进程在三个基本状态之间转换的典型原因. a. 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态变 为执行状态。 b. 当前进程因发生某事件而无法执行,如访问已被占用的临界资源,就会使进程由执行 状态转变为阻塞状态。 c. 当前进程因时间片用完而被暂停执行,该进程便由执行状态转变为就绪状态。 9. 为什么要引入挂起状态?该状态有哪些性质? a. 引入挂起状态主要是出于4种需要(即引起挂起的原因): 终端用户的请求,父进程 请求,负荷调节的需要,操作系统的需要。

《操作系统》习题集:第2章 进程与线程(第1部分)

第2章进程与线程-习题集 一、选择题 1.以下关于进程的描述中,正确的是()。【*,联考】 A. 进程获得CPU运行是通过调度得到的 B. 优先级是进程调度的重要依据,一旦确定就不能改变 C. 在单CPU的系统中,任意时刻都有一个进程处于运行状态 D. 进程申请CPU得不到满足时,其状态变为阻塞 2.一个进程是()。【*,联考】 A. 由处理机执行的一个程序 B. 一个独立的程序+数据集 C. PCB结构、程序和数据的组合 D. 一个独立的程序 3.并发进程指的是()。【*,★,联考】 A. 可并行执行的进程 B. 可同一时刻执行的进程 C. 可同时执行的进程 D. 不可中断的进程 4.当一个进程处于这样的状态时,(),称为阻塞态。【*,★,联考】 A. 它正等着输入一批数据 B. 它正等着进程调度 C. 它正等着分给它一个时间片 D. 它正等进入内存 5.某个运行中的进程要申请打印机,它将变为()。【*,联考】 A. 就绪态 B. 阻塞态 C. 创建态 D. 撤销态 6.以下进程状态转变中,()转变是不可能发生的。【**,★,联考】 A. 运行→就绪 B. 运行→阻塞 C. 阻塞→运行 D. 阻塞→就绪 7.当()时,进程从执行状态转变为就绪状态。【*,联考】 A. 进程被调度程序选中 B. 时间片到 C. 等待某一事件 D. 等待的事件发生 8.一个进程的基本状态可以从其他两种基本状态转变过来,这个基本状态一定是()。【**,联考】 A. 运行状态 B. 阻塞状态 C. 就绪状态 D. 完成状态 9.当一个进程完成一个时间片后,系统需要将该进程的状态由运行状态转变为()。【*,联考】 A. 就绪状态 B. 阻塞状态 C. 撤销状态 D. 创建状态 10.进程状态由就绪态转换为运行态是由()引起的。【**,联考】 A. 中断事件 B. 进程状态转换 C. 进程调度 D. 为程序创建进程 11.下列选项中,降低进程优先级的合理时机是()。【***,10考研】 A. 进程的时间片用完 B. 进程刚完成I/O,进入就绪队列 C. 进程长期处于就绪队列中 D. 进程从就绪状态转为运行态 12.()必会引起进程切换。【**,★,联考】

(完整版)第二章进程管理习题和答案

--一、填空题 1. 进程是一个程序对某个数据集的一次执行过程。进程从结构上讲,包括程序、 数据和PCB 三部分。 2. 进程是一个动态的概念,程序是一个静态的概念。 3. 操作系统中,可以并行工作的基本单位是进程,它是由程序、数据集和PCB 组 成。 4. 进程存在的唯一标志是PCB 的存在。当系统创建一个进程时,系统为其建立 一个PCB ,当进程被撤销时系统就将其收回。 5. 进程有三种基本状态,即运行状态、就绪状态、阻塞状态。当进程由(1) 变换到(2)或(3)时,就会立即引起重新调度。 6. 在操作系统中,不可中断执行的操作称为原语。 7. 并发进程之间的基本关系是同步或互斥。其中互斥是指进程之间的一种间接关 系。 8?临界资源是指一段时间只允许一个进程使用的资源_,而临界区是指—进程中访问临界资源的程序代码。 9. P,V 操作原语是在信号量上操作的。 10. 信号量的物理意义是:当信号量的值大于零时,表示_ 可用资源的数量当信 号量值小于零时,其绝对值为—等待使用信号量所代表资源的进程的数量。 11. 有n 个进程共享同一个临界区,若使用信号量机制实现对临界资源的互斥访 问, 则信号量值的变化范围是1~-(n-1 )。 12. 如果系统中有n 个进程,则在等待(阻塞)队列中进程的个数最多可为个 n 。 13. 如果信号量的当前值为- 5,则表示系统中在该信号量上有 5 个等待进程。 14. 某程序运行时经常需打印中间结果。计算时,该进程处于_ 用户态,打印时处 于系统态,打印结束时进程处于用户态。(指系统状态)、

15. 在操作系统中引入线程的主要目的是—减少程序并发执行时的时空开销,使 OS 更具有并发性。 16. 如果一个程序能为多个进程同时共享执行,那么它应该以纯码形式编写,即

操作系统-第二章-进程和线程复习

操作系统-第二章-进程和线程复习题(五)

第二章练习题 一、单项选择题 1.某进程在运行过程中需要等待从磁盘上读入数据,此时该进程的状态将()。 A. 从就绪变为运行;B.从运行变为就绪; C.从运行变为阻塞;D.从阻塞变为就绪2.进程控制块是描述进程状态和特性的数据结构,一个进程()。 A.可以有多个进程控制块; B.可以和其他进程共用一个进程控制块; C.可以没有进程控制块; D.只能有惟一的进程控制块。 3.临界区是指并发进程中访问共享变量的()段。 A、管理信息 B、信息存储 C、数据 D、程序 4. 当___时,进程从执行状态转变为就绪状态。 A. 进程被调度程序选中 B. 时间片到 C. 等待某一事件 D. 等待的事件发生 5. 信箱通信是一种()通信方式。 A. 直接通信 B. 高级通信 C. 低级通信 D. 信号量 6. 原语是()。 A、一条机器指令 B、若干条机器指令组成

C、一条特定指令 D、中途能打断的指令 7. 进程和程序的一个本质区别是()。 A.前者为动态的,后者为静态的; B.前者存储在内存,后者存储在外存; C.前者在一个文件中,后者在多个文件中; D.前者分时使用CPU,后者独占CPU。 8. 任何两个并发进程之间存在着()的关系。 A.各自完全独立 B.拥有共享变量 C.必须互斥 D.可能相互制约 9. 进程从运行态变为等待态可能由于()。 A.执行了V操作B.执行了P操作 C.时间片用完D.有高优先级进程就绪 10. 用PV操作管理互斥使用的资源时,信号量的初值应定义为()。 A.任意整数B.1 C.0 D.-1 11. 现有n个具有相关临界区的并发进程,如果某进程调用P操作后变为等待状态,则调用P操作时信号量的值必定为()。 A.≤0B.1 C.n-1 D.n 12. 用PV操作管理临界区时把信号量的初值定义为1,现已有一个进程在临界区,但有n个进程在等待进入临界区,这时信号量的值为()。 A.-1 B.1 C.-n D.n 13. 用V操作唤醒一个等待进程时,被唤醒进程的状态应变成()状态。

最新操作系统——随堂作业3-第二章进程2

随堂练习3 一单选 1、(B)是解决进程间同步与互斥的一对低级通信原语。 A、lock和unlock B、P和V C、W和S D、send和receive 2、临界区是指并发进程中共享临界资源的(C) A、内存区 B、数据区段 C、程序区段 D、管理信息 3、利用P、V操作控制临界区的使用。当有N个进程希望进入临界区时,对应信号量的最大取值范围可能是( C)。A.1~-1 B.-1~1 C.1~1-N D.-N~N-1 4、在操作系统中,对信号量S的P原语操作定义中,使进程进入相应等待队列等待的条件是( C )。 A、S大于0 B、S等于0 C、S小于0 D、S不等于0 5、在一段时间内,只允许一个进程访问的资源称为( C )。 A、共享资源 B、临界区 C、临界资源 D、共享区 6、进程间的基本关系为(B )。 A.相互独立与相互制约 B.同步与互斥 C.并行执行与资源共享 D. 信息传递与信息缓冲 7、两个进程合作完成一个任务,在并发执行中,一个进程要等待其合作伙伴发来信息,或者建立某个条件后再向前执行,这种关系是进程间的( A )关系。 A、同步 B、互斥 C、竞争 D、合作 8、信号量被定义为一个整形变量, 其初始值是( A )。 A、整数 B、无限制 C、非负数 D、零 9、对于两个并发进程, 设互斥信号量为mutex, 若 mutex = 0 则( B )。 A、表示没有进程进入临界区。 B、表示一个进程进入临界区。 C、表示一个进程进入临界区, 另一个进程等待进入。 D、表示两个进程进入临界区. 10、下列资源中那些不是临界资源( B )。 A、打印机 B、非共享资源 C、共享变量 D、共享缓冲区 11、为了进行进程协调, 进程之间应当具有一定的联系, 这种联系通常采用进程间交换数据的方式进行, 这种方式称为 ( D )。 A、进程互斥 B、进程同步 C、进程制约 D、进程通信 12、进程控制块中的现场信息是在( D )保存的。 A、创建进程时 B、处理器执行指令时 C、中断源申请中断时 D、中断处理程序处理中断前 二填空 1、进程被创建后,最初处于__就绪__ 状态,然后经进程调度程序选中后进入执行状态。 2、进程进行了P操作后,若能继续运行,P操作前信号量的值应该___大于0_____。 3、进程的同步和互斥反映了进程间直接制约和___间接制约_______的关系。 4、每执行一次V操作,信号量的数值S加1。若S__>__0(此处填>或<或>=或<= ),则该进程继续执行。 5、利用信号量实现进程的_互斥___ ,应为临界区设置一个信号量mutex,其初值为1,表示该资源尚未使用,临界区应置于P(mutex)和V(mutex)原语之间。 6、通常,_线程_______的定义是是进程中执行运算的最小单位。在现代操作系统中,资源的分配单位是进程。 7、每执行一次P操作,信号量的数值S减1。若S 0,则该进程___继续执行_____。 8、并发进程中涉及到共享变量的程序段称为___临界区_____,两个进程同时进入相关的临界区会造成与时间有关的错误。 9、计算机系统中, 只有一个处理器, 则多个进程将争夺CPU资源, 如何把CPU有效地分配给进程, 这是__进程调度_____要解决的问题. 10、利用信号量实现进程的互斥,应为临界区设置一个信号量mutex,其初值为___1______,表示该资源尚未使用,临

操作系统第2章(进程和线程的管理习题及解答)

第2章进程和线程的管理习题及解答 例题解析 例2.2.1 试说明进程和程序之间的区别和联系。 解进程和程序是既有区别又有联系的两个概念。 (1)进程是动态的,程序是静态的。程序是一组有序的指令集合,是一个静态的概念;进程则是程序及其数据在计算机上的一次执行,是一个动态的集合。离开了程序,进程就失去了存在的意义,但同一程序在计算机上的每次运行将构成不同的进程。程序可看作是电影的胶片,进程可以看作电影院放电影的过程。 (2)一个进程可以执行多个程序,如同一个电影院的一场电影可放映多部影片。 (3)一个程序可被多个进程执行,如同多个影院同时利用一个电影的胶片放映同一部电影。 (4)程序可以长期保存,进程只能存在于一段时间。程序是永久存在的,而进程有从被创建到消亡的生命周期。 例2.2.2 举例说明多道程序系统失去了封闭性和再现性。 解例如,有两个循环程序A和B,共享一个变量N。程序A每执行一次时,都要做N:=N+1操作;程序B则每执行一次时,都要执行print(N)操作,然后再将N的值置成“0”。程序A和B在多道程序系统中同时运行。假定某时刻变量N的值为n,可能出现下述三种情况: (1)N:=N+1 在print(N)和N:=0之前,此时得到N值变化过程为n+1、n+1、0; (2)N:=N+1 在print(N)和N:=0之后,此时得到N值变化过程为n 、 0 、1; (3)N:=N+1 在print(N)之后和N:=0之前,此时得到N

值变化过程为n、n+1、0。 所以,在A、B程序多次执行过程中,虽然其每次执行时的环境 和初始条件都相同,但每次得到的结果却不一定相同。 例 2.2.3 为什么将进程划分成执行、就绪和阻塞三个基本状态? 解根据多道程序执行的特点,进程的运行是走走停停的。因此 进程的初级状态应该是执行和等待状态。处于执行状态的进程占用 处理机执行程序,处于等待状态的进程正在等待处理机或者等待其 它某种事件的发生。但是,当处理机空闲时,并不是所有处于等待 状态的进程都能放到处理机上执行,有的进程即使分配给它处理机,它也不能执行,因为它的执行的条件没有得到满足。因此,将等待 状态的进程分成两部分,一部分是放在处理机上就能立即执行,这 就是就绪的进程;另一部分是仍需等某种事件发生的进程,即使放 在处理机上也不能执行的进程,这就是阻塞进程。 例 2.2.4 进程的挂起状态与进程的阻塞状态和就绪状态有何异同? 解相同点是它们都没有占用处理机。不同点是挂起状态的进程 是处于一种静止状态,不会参与对资源的竞争,在解除挂起之前, 进程不会有新的资源要求,也不会有占用处理机的机会;阻塞状态 和就绪状态的进程均处于活动状态,它们都有获得处理机的机会, 都可能有新的资源要求。 例 2.2.5 两个并发进程P1和P2的程序代码在下面给出。其中,A、B、C、D和E均为原语。 P1: begin P2: begin

习题解答——第2章进程与线程

第2章进程与线程思考与练习题 4 6.进程的三个基本状态如图所示,图中1、2、3、4表示某种类型的状态变迁,试回答以下问题:1什么“事件”引起各状态之间的变迁? 2系统中常常由于某一进程的状态变迁引起另一进程也产生状态变迁,我们把这种变迁称为因果变迁。试判断下述哪些是因果变迁?并说明理由。 3→1, 2→1, 3→2, 4→1, 3→4 6下述哪些变迁不会引起其它变迁,为什么? 1, 2, 3, 4 答:(1)1为进程调度, 2为时间片用完, 3为请求I/O或等待某事件, 4为I/O完成或事件完成。 (2)3→1,2→1为因果变迁,其他均不是,因为前者均是一个进程从CPU下来,另一个就绪态的进程被调度。 (3)1和4不会引起其他变迁,理由同(2)。 7.假如有以下程序段: S1: a = 5 - x; S2: b = 3 * x; S3: c = a + b; S4: d = c + 3; 1试画图表示它们执行时的先后次序。 2利用Bernstain条件证明,S1和S2是可以并发执行的,S3和S4是不可以并发执行的。 3试用信号量写出它们可以并发执行的程序。 答: (1)进程的执行次序如下图

(2)对于进程S1和S2 R(S1)={x},W(S1)={a} R(S2)={x},W(S2)={b} R(S1)∩W(S2)∪R(S2)∩W(S1)∪W(S1)∩W(S2)=Ф由Bernstain条件得知,S1和S2可以并发执行。 R(S3)={a,b},W(S3)={c} R(S4)={c},W(S4)={d} R(S3)∩W(S4)∪R(S4)∩W(S3)∪W(S3)∩W(S4)={c} 由Bernstain条件得知,S1和S2不可以并发执行。 (3)定义信号量a=b=c=0 S1: S2: S3: S4: a=5-x b=3*x p(a) p(c) v(a) v(b) p(b) d=c+3 c=a+b v(c)

相关文档
相关文档 最新文档