寄存器和存储器的区别

1、存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是50MB/S左右。

内存和寄存器就是为了解决存储器读写速度慢而产生的多级存储机制,从20世纪50年代开始,磁芯存储器曾一度成为主存的主要存储介质,但从20世纪70年代开始,逐步被半导体存储器所取代,目前的计算机都是用半导体存储器。现在的DDR2内存的读写速度一般为6~8GB/S,跟机器性能也有关系。

2、寄存器(又称缓存)一般是指由基本的RS触发器结构衍生出来的D触发,就是一些与非门构成的结构,一般整合在CPU内,其读写速度跟CPU的运行速度基本匹配,但因为性能优越,所以造价昂贵,一般好的CPU也就只有几MB的2级缓存,1级缓存更小。使用寄存器可以缩短至零长度、节省存储空间,提高指令的执行速度。

互斥同步区别和联系

区别:

互斥:是指在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。

同步(强调顺序性):是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。  

联系:

同步(强调顺序性)是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)。

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。  

 

wait和signal,信号量,pv操作

信号量被广泛应用于三个目的是互斥、同步和描述前趋关系。

pv:P—— passeren,中文译为"通过",V—— vrijgeven,中文译为"释放"

wait操作和signal操作是计算机操作系统中进程控制的信号量机制的概念。

在进程控制中如何合理对共享资源分配便是一个关键的问题,所以引入了信号量的这个概念,通过pv操作便可以达到对空闲共享资源的合理分配

一、信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。

1)、当它的值大于0时,表示当前可用资源的数量;

2)、当它的值小于0时,其绝对值表示等待使用该资源的进程个数。

二、PV操作,只有通过pv操作才可以改变信号量的值。

1)、p操作(wait):申请一个单位资源,进程进入。简而言之就是信号量减一。

2)、v操作(signal):释放一个单位资源,进程出来。简而言之就是信号量加一。

 

并发,并行;互斥,同步,异步;

并发:是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。实际是由于操作时间太短造成的假像;

并行:在多处理器系统中,而且可以重叠执行。在多处 理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事 件之间不一定要同一时刻发生。

互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。
同步(一步一步按顺序执行):进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。

异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不 需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情
 

 

1. 死锁

死锁:死锁是指多个进程相互等待,互不相让,导致所有进程无限期等待。

  • 资源死锁:资源死锁是因为每个进程都在等待其他进程释放资源,资源死锁是最常见的死锁类型。
  • 通信死锁:通信死锁是指由于消息丢失,导致通信双方都在相互等待对方发送消息,通常可通过设置适当对超时时间来解决

 

2. 资源死锁条件

(1)互斥条件:一个资源不能被两个以上的进程同时占有
(2)占有和等待条件:已经得到某个资源对进程可以在申请新的资源
(3)不可抢占条件:已经分配给一个进程对资源不能被强制性地抢占,它只能被占有它对进程显式释放
(4)环路等待条件:死锁发生时,系统中一定有两个及以上的进程形成一条环路,每个进程都等待着下一个进程所占有的资源

死锁发生时,以上四个条件必定同时满足,其中一个条件不成立死锁都不会发生。因此可以破坏上述任一条件来预防死锁

 


3. 死锁处理策略

四种死锁处理策略:
(1)忽略该问题。若要彻底防止死锁,代价很大,并且死锁发生频率比较,影响比较小,可以直接忽略
(2)检测死锁并恢复。系统并不阻止死锁的发生,而是允许死锁对发生,当检测到死锁后采取相应措施进行恢复
(3)避免死锁。对资源进行分配时进行检查,若可能产生死锁,则不分配资源,避免死锁的发生
(4)防止死锁发生。通过破坏引起死锁对四个必要条件,防止死锁发生

 

原语

是由若干条指令组成的,用于完成一定功能的一个过程。完成某种特定功能的一段程序,具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断

 

中断、异常和系统调用的关系

1.中断的概念

中断是CPU的一个功能,就是;

CPU停下当前的工作,

  • 保留现场后
  • 自动地转去执行相应的处理程序,
  • CPU控制权发生改变
  • 处理完该事件后再返回断点继续执行被刚才被打断的程序。

2.中断的分类

2.1分为软中断和硬中断

软中断:

a.编程异常通常叫做软中断(空指针,数组越界,classnotfound)

b.软中断是通讯进程之间用来模拟硬中断的 一种信号通讯方式。

c.中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能

d.软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。

硬中断:

a.硬中断是由外部事件引起的因此具有随机性和突发性(断电);软中断是执行中断指令产生的,无面外部施加中断请求信号,因此

   中断的发生不是随机的而是由程序安排好的。

b.硬中断的中断响应周期,CPU需要发中断回合信号(NMI不需要),软中断的中断响应周期,CPU不需发中断回合信号。

c.硬中断的中断号是由中断控制器提供的(NMI硬中断中断号系统指定为02H);软中断的中断号由指令直接给出,无需使用中断控制器。

d.硬中断是可屏蔽的(NMI硬中断不可屏蔽),软中断不可屏蔽。

区别:

a.软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的

b.软中断是由程序调用发生的,而硬中断是由外设引(在输入文本的时候拔掉键盘)发的

c.硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较长时间

2.2可屏蔽中断和不可屏蔽中断

2.3中断可分为三类:

  1. 第一类是由CPU外部引起的,称作中断,如I/O中断、时钟中断、控制台中断等。
  2. 第二类是来自CPU的内部事件或程序执行中的事件引起的 过程,称作异常,如由于CPU本身故障(电源电压低于105V或频率在47~63Hz之外)、程序故障(非法操作码、地址越界、浮点溢出等)等引起的过程。
  3. 第三类由于在程序中使用了请求系统服务的系统调用而引发的过程,称作“陷入”(trap,或者陷阱)。前两类通常都称作中断,它们的产生往往是无意、

被动的,而陷入是有意和主动的。

第一类(中断)+第二类(异常)= 中断

第三类(系统调用)= 系统调用

 

系统调用:由​​操作系统​​​实现提供的所有系统调用所构成的集合即​​程序接口​​​或应用编程接口(Application Programming Interface,API)。是​​应用程序​​同系统之间的接口。

就是执行一个系统调用指令,将控制权将目态转为管态;任何单 CPU 计算机一次只能执行一条指令。如果一个进程正在用户态运行一个程序,并且需要一个系统服务,比如从一个文件读取数据,那么它就必须执行一个陷阱(trap)或系统调用指令,将控制转移到操作系统。操作系统接着通过参数检查找出所需要的调用进程。

然后,它执行系统调用,并把控制返回给系统调用后面跟随着的指令。在某种意义上,进行系统调用就像进行一个特殊的过程调用,但是只有系统调用可以进入内核,而过程调用不能。

  一般把系统调用的编号放在操作系统所期望的地方,如寄存器中。然后执行一个 trap 指令,将用户态切换到内核态,并在内核中的一个固定地址开始执行。TRAP 指令实际上与过程调用指令非常类似,它们后面都跟随着一个来自远处位置的指令,以及供以后使用的一个保存在栈中的返回地址。

  然而,trap 指令与过程指令存在两个方面的差别。首先,它的副作用是,切换到内核态。而过程调用指令并不改变模式。其次,不像给定过程所在的相对或绝对地址那样,trap 指令不能跳转到任意地址上。根据机器的体系结构,或者跳转到一个单固定地址上,或者指令中有一8位长的字段,它给定了内存中一张表格的索引,这张表格中含有跳转地址。

  跟随在 trap 指令后的内核代码开始检查系统调用编号,然后分派给正确的系统调用处理器,这通常是通过一张由系统调用编号所引用的、指向系统调用处理器的指针表来完成。此时,系统调用处理器运行。一旦系统调用处理器完成其工作,控制可能会在跟随 trap 指令后面的指令中返回给用户空间库过程。这个过程接着以通常的过程调用返回的方式,返回到用户程序。

  为了完成整个工作,用户程序还必须清除堆栈,如同它在进行任何过程调用之后一样。假设堆栈向下增长,如经常所做的那样,编译后的代码准确地增加堆栈指针值。在这之后,原来的程序就可以随意执行了。

系统调用和过程调用

  • 状态切换:系统调用要进行状态切换,由用户态切换到系统态;过程调用只需要在用户态就能完成
  • 速度效率:系统调用反应快 直接通过内存访问 而过程调用是要从​​硬盘​​中提取数据 速度所以没系统调用快

 

常见系统调用

进程管理

pid=fork() 创建一个与父进程相同的子进程

pid=waitpid(pid, &statloc, options) 等待一个子进程终止

s=execve(name, argv, environp) 替换一个进程的核心映像

exit(status) 终止进程执行并返回状态

文件管理

fd=open(file, how, ...) 打开一个文件供读、写或两者

s=close(fd) 关闭一个打开的文件

n=read(fd, buffer, nbytes) 把数据从一个文件读到缓冲区中

n=write(fd, buffer, nbytes) 把数据从缓冲区写到一个文件中

position=lseek(fd, offset, whence) 移动文件指针

s=stat(name, &buf) 取得文件的状态信息

目录和文件系统管理

s = mkdir(name, mode) 创建一个新目录

s = rmdir(name) 删去一个空目录

s = link(name1, name2) 创建一个新目录项 name2,并指向 name1

s = unlink(name) 删去一个目录项

s = mount(special, name, flag) 安装一个文件系统

s = umount(special) 卸载一个文件系统

杂项

s = chdir(dirname) 改变工作目录

s = chmod(name, mode) 修改一个文件的保护位

s = kill(pid, signal) 发送信号给一个进程

seconds = time(&seconds) 自 1970 年 1 月 1 日 起的流逝时间

 

用于进程管理的系统调用

   在 UNIX 中,fork 是唯一可以在 POSIX 中创建进程的途径。它创建一个原有进程的精确副本,包括所有的文件描述符、寄存器等内容。在 fork 之后,原有的进程及其副本(父与子)就分开了。在 fork 时,所有的变量具有一样的值,虽然父进程的数据被复制用以创建子进程,但是其中一个的后续变化并不会影响到另一个。(由父进程和子进程共享的程序正文,是不可改变的。)fork 调用返回一个值,在子进程中该值为 0,并且在父进程中等于子进程的进程标识符(Process IDentifier,PID)。使用返回的 PID,就可以在两个进程中看出哪一个是父进程,哪一个是子进程。

  多数情形下,在 fork 之后,子进程需要执行与父进程不同的代码。这里考虑 shell 的情形。它从终端读取命令,创建一个子进程,等待该子进程执行命令,在该子进程终止时,读入下一条命令。为了等待子进程结束,父进程执行 waitpid 系统调用,它只是等待,直至子进程终止(若有多个子进程的话,则直至任何一个子进程终止)。waitpid 可以等待一个特定的子进程,或者通过将第一个参数设为 -1 的方式,等待任何一个老的子进程。在 waitpid 完成之后,将把第二个参数 statloc 所指向的地址设置成子进程的退出状态。有各种可用的选项,它们由第三个参数确定。

  现在考虑 shell 如何 fork。在键入一条命令后,shell 调用 fork 创建一个新的进程。这个子进程必须执行用户的命令。通过使用 execve 系统调用可以实现这一点,这个系统调用会引起整个核心映像被一个文件所替代,该文件由第一个参数给定。(实际上,该系统调用是 exec 系统调用,但是若干个不同的库过程使用不同的参数和稍有差别的名称调用该系统调用。