2.计算机操作系统

4 篇文章 0 订阅

2.计算机操作系统

1.进程与线程区别

进程是系统资源分配的最小单位,线程是程序执行的最小单位;
进程使用独立的数据空间,线程共享进程的数据空间。
线程是进程的一个实体,是cpu调度和分配的基本单位,是最小的cpu执行单元。线程自己不拥有任何系统资源,但是它可以访问其隶属进程的全部资源,所以线程创建,撤销,切换的开销远小于进程,一个进程可以拥有多个线程。

2 进程(或作业)的调度算法有哪些

1优先级调度算法
2 高响应比优先调度算法
3 时间片的轮转调度算法
4 先来先服务调度算法
5 短作业优先调度算法(高响应比优先调度)
6 多级反馈队列调度算法

进程间通信(IPC):看图

3.进程间通信的方式有哪些

管道,命名管道,消息队列,信号量,信号,共享内存,套接字
进程间通信
每个进程之间各自拥有不同的用户地址空间,任何一个进程的全集变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
3.1 管道(pipe)
管道是一种半双工的通信方式,数据智能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常是指父子进程关系。
3.2命名管道(named pipe)
命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
消息队列 message queue
消息队列是由消息组成的链表,存放在内核中并由消息队列标识符标识。消息队列克服了消息传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
是用于两个进程之间的通信,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据。而另一个进程则从那个消息队列中取数据。需要注意的是,消息队列是用创建文件的方式创建的,如果一个进程向某个消息队列中写入了数据,另一个进程没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据。
信号量(semophore)
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。
它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此主要作为进程间以及同一进程不同线程之间的同步手段。
信号
用于通知接受进程某个事件已经发生。
共享内存(shared memory)
共享内存由一个进程创建,但多个进程都可以访问。(两个不同进程A,B共享内存的意思是:同一块物理内存被映射到进程A,B各自的进程地址空间,进程A可以即时看到进程B对共享内存中数据的更新,反之亦然)
套接字(socket)
套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

4线程同步

1线程同步的基本概念
临界资源:一次仅允许一个线程使用的资源
临界区:指的是一个访问公用资源(被多个线程共享的临界资源)的程序片段,而这些公用资源又无法同时被多个线程访问的特性。当有线程进入临界区时,其他线程或是进程必须等待,有一些同步的机制必须在临界区的进入点与离开点实现,以确保这些共享资源是被互斥获得使用的。
2线程同步的方式
临界区用于单个进程中线程间的同步;互斥量,信号量,事件用于多个进程间的各个线程间实现同步。
1 临界区:
使用临界区对象。拥有临界区对象的线程可以访问被保护起来的资源或代码段。其他线程若想访问,则被挂起,知道拥有临界区对象的线程放弃临界区对象为止。
2互斥量
采用互斥对象机制,只有拥有互斥对象的线程才能有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会被多个线程访问。(互斥对象和临界区对象非常相似,只是其允许在进程间使用,而临界区只限制于同一进程的各个线程之间使用)
3信号量
它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。
4事件(信号)
事件机制允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。
死锁产生的必要条件
1.互斥:一个资源一次只能被一个进程所使用。
2.不剥夺:一个资源仅能被占有它的进程所释放,而不能被别的进程强制剥夺
3.请求与保持:指进程占有自身本来拥有的资源并要求其他资源
4.循环等待:存在进程资源的循环等待链,链中每一个进程已获得的资源同时被下一个进程所请求。

5内存

内存分配分为连续分配和非连续分配管理两种。
3.1内存连续分配
1 单一连续分配:分为系统区和用户区,系统区供给操作系统使用,用户区供给用户使用,内存中永远只有一道程序。
2 固定分区分配:最简单的一种多道程序管理方式,它将用户内存分为若干个固定大小的区域,每个分区只装入一道作业。
3动态内存分配:又称可变分区分配,是一种动态划分内存的方法,这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态的建立分区。
3.2非连续分配
1.分页式存储管理:分页存储管理时将一个进程的地址(逻辑地址空间)划分为若干个大小相等的区域,称为页。
2.分段式存储管理:
线程中共享进程的哪些资源
1进程的代码段,进程的公有数据,进程打开的文件描述符,信号处理器,进程当前的目录,进程用户ID,进程组ID
线程独有的资源
1 线程ID,寄存器(程序计数器)3线程的堆栈4错误返回码5线程的信号屏蔽码6线程的优先级
上下文切换
指内核在CPU上对进程或者线程进行切换,上下文切换过程中的信息被保存在进程控制块中(PCB);PCB又称为切换帧。上下文切换的信息会一直保存在CPU的内存中,直到再次使用。
流程:
1 挂起一个进程,将这个进程在CPU的状态(上下文信息)存储与内存的PCB中
2 在PCB中检索下一个进程的上下文并将其在CPU的寄存器中恢复。
3 跳转到程序计数器所指向的位置(即跳转到中断时的代码行)并恢复该进程。

内核态和用户态

内核态就是特权态,用户态就是非特权态。程序在特权态的状态下,访问资源不会受到限制。在非特权态的状态下,访问资源会受到限制。运行在内核态的程序可以访问的资源多,但可靠性、安全性要求高,维护管理都较复杂;用户态程序访问的资源受限,但可靠性、安全性要求低,自然编写维护起来都较简单。一个程序到底应该运行在内核态还是用户态取决于其对资源和效率的需求。

线程池的核心参数

1corePoolSize:线程池中核心线程的数量
2maximumPoolSize:线程池中最大线程的数量
3keepAliveTime:当前线程数量超过corePoolSize时,空闲线程的存活时间
4unit:keepAliveTime的时间单位
5workQueue:任务队列,任务被提交但尚未被执行的任务存放的地方。
线程池的拒绝策略
1AbortPolicy:直接抛出异常,阻止线程正常运行。
2CallerRunsPolicy:如果被丢弃的线程任务未关闭,则执行该线程任务。
3DiscardOldestPolicy:移除线程队列中最早的一个线程队列,并尝试提交当前任务。
4DiscardPolicy:丢弃当前的线程任务而不做任何处理。

内存的管理方式

块式管理:把主存分为一块一块的,就算程序片段只有几个字节,也会分配一块,这样会造成大量的浪费。但是易于管理。
页式管理:把主存分为一页一页的,每一页的空间比一块的空间小很多,空间利用率比块式管理高很多。
段式管理:把主存分为一段一段的,每一段的空间又要比一页的空间小很多。但是一个程序片段可能会被分为几十段,很多时间浪费在计算每一段的物理地址上。
段页式:结合了段式管理和页式管理的优点,将程序分为若干段,每个段被分为若干页。段页式每取一次数据,要访问三次内存。
页面置换算法
1 最优页面置换算法:不可能实现
2 最近未使用页面置换算法:
3先进先出页面置换算法(FIFO)
4第二次机会页面置换算法
5时钟页面置换算法
6最近最少使用页面置换算法(LRU)
7最不常用页面置换算法
虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存空间(一个连续完整的地址空间),而实际上,它通常是被分割成多个物理内存碎片,还有部分暂时存在外部磁盘存储器上,在需要时进行数据交换。
windows下的内存管理方法
1 虚拟内存
2 内存映射文件
3 内存栈堆
内存映射文件是什么?
1它是一种文件操作的方式,由操作系统支持,优点是当需要操作一些大文件时,它的效率比其他的文件操作方式更高,能很高效的处理大文件。
2 与虚拟内存的区别:
虚拟内存和内存映射文件都是将一部分内容加载到内存中,另一部分放在磁盘中的一种机制,两者都是应用程序动态性的基础,由于两者的虚拟性,对用户都是透明的。

虚拟内存其实就是硬盘的一部分,时计算机RAM与硬盘的数据交换区,因为实际的物理内存可能远远小于进程的地址空间,这就需要把内存中暂时用不到的数据放到硬盘上的一个特殊地方。当请求的数据不在内存中时,系统产生缺页中断,内存管理器便将对应的内存页重新从硬盘调入物理内存。

内存映射文件,是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合用来管理大文件。
两者的区别:
1 虚拟内存使用硬盘只能是页面文件,而内存映射使用的磁盘部分可以是任何磁盘文件。
2两者的架构不同,或者说应用的场景不同,虚拟内存是架构在物理内存之上的,其引入的原因是因为实际的物理内存会小于运行程序所需的空间,即使现在计算机中的物理内存非常大,程序的尺寸也在不断的增长,将所有运行的程序全部加载到内存中不经济也不现实。内存映射文件架构在程序的地址空间之上,32位机地址空间只有4G,而某些大文件的尺寸可要远远超过这个值。
3 可以通过mmap()方法建立相应的映射。
内存栈堆
Linux中查看内存使用情况的命令
1top:用于实时显示process的动态
2free:用于查看内存使用的情况
3cat/proc/meminfo:查看RAM的使用情况
Linux查看端口状态
1netstat -ntlp:查看所有TCP端口
2 netstat -ntulp | grep 8080:查看所有8080端口
3 netstat -anlp:查看服务器上所有的服务跟端口
4 netstat -ntulp |grep nginx:查看某服务占用的端口情况
5 netstat -pnt |grep :80|wc:查看指定端口的连接数量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值