Java程序员需要知道的操作系统知识汇总(持续更新)

简介: 操作系统管理着计算机的硬件和软件,它是软件和硬件能够交互的基础。从本质上来讲,操作系统还是一个运行在计算机上的程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

听说微信搜索《Java鱼仔》会变更强哦!


本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦


(一)什么是操作系统


操作系统管理着计算机的硬件和软件,它是软件和硬件能够交互的基础。从本质上来讲,操作系统还是一个运行在计算机上的程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。


(二)用户态和系统态是什么


所谓用户态和系统态,其实是cpu的一种状态。


用户态也称为普通态,用户态运行的进程可以直接读取用户程序的数据,我们运行的程序基本都是在用户态。


内核态也叫特权态,cpu可以访问计算机的任何资源


区分为用户态和系统态是最主要原因是要把用户程序和系统程序区分开,以利于程序的共享和保护。


用户态访问内核态的功能的方式叫做系统调用,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。


系统调用按功能大致可以区分为:


1、设备管理。完成设备的请求或释放,以及设备启动等功能。


2、文件管理。完成文件的读、写、创建及删除等功能。


3、进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。


4、进程通信。完成进程之间的消息传递或信号传递等功能。


5、内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。


(三)进程、线程和程序的区别


程序是指含有指令和数据的文件,或者说程序是静态的代码。进程是系统运行程序的基本单位,一个进程就是一个执行中的程序。进程是独立运行的个体。线程是比进程更小的执行调度单位,一个进程在执行中可以产生多个线程,多个线程共享同一块内存空间和系统资源。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。


(四)进程有哪几种状态


操作系统的进程有五种状态:


创建状态(new):进程正在被创建,还未到就绪状态


就绪状态(ready):这是指进程已经准备好运行的状态,即进程已分配到除CPU以外所有的必要资源后,只要再获得CPU,便可以立刻执行。这是指进程已经准备好运行的状态,即进程已分配到除CPU以外所有的必要资源后,只要再获得CPU。


运行状态(running):进程正在处理器上上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。


阻塞状态(waiting):正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态,即进程执行受到阻塞。即使此时cpu处于空闲也无法执行。


结束状态(terminated):进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行


网络异常,图片无法展示
|

(五)进程间的通信方式有哪些


每个进程都有自己的地址空间,不同进程之间是不可见的,如果进程间需要通信的话必须通过内核,在内核中开辟一块缓冲区,一个进程把数据拷贝到内核缓冲区,其他进程把数据从内核态读取到用户态。这种机制称为进程间通信。 进程间通信的方式有多种:

管道/匿名管道(pipes):用于父子进程和兄弟进程之间数据的传递,管道的本质是一个内核缓冲区,管道一端的进程将数据顺序写入缓冲区,另一端的进程将数据顺序读入。


有名管道(Name pipes):有名管道通过FIFO的方式进行传递,有名管道的文件形式存在于文件系统中,可以实现本机任意两个进程之间的通信。 信号(signal):Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。


消息队列(Message Queuing):消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识、消息队列允许一个或多个进程向它写入与读取消息、消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比FIFO更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。


共享内存(share memory):使得多个进程可以可以直接读写同一块内存空间,是最快的可用IPC形式。由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥。


信号量(Signal):信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步


套接字(Socket):套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。


(六)操作系统中进程的调度算法


操作系统中的进程调度算法目的是为了确定进程的执行顺序,从而最大化利用CPU资源

先到先服务(FCFS):从就绪队列中选择等待时间最长的进程(就是最早进来的进程),等待进程执行完成或者放弃CPU时再重新选择。 轮转法(Round Robin):也叫做时间片轮转法,每个进程被分配一个时间片,轮流执行。


短作业优先(SJF):从就绪队列中选择预计运行时间最短的进程,等待进程执行完成或者放弃CPU时再重新选择。


优先级调度:给每个进程分配一个优先级,从就绪队列中选择优先级最高的进程,等待进程执行完成或者放弃CPU时再重新选择。


多级反馈队列调度算法


(1)设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先级,从第一个开始逐个降低。不同队列进程中所赋予的执行时间也不同,优先级越高,时间片越小。


(2)每个队列都采用FCFS(先来先服务)算法。轮到该进程执行时,若在该时间片内完成,便撤离操作系统,否则调度程序将其转入第二队列的末尾等待调度......。若进程最后被调到第N队列中时,便采用RR方式运行。


(3)按队列优先级调度。调度按照优先级最高队列中诸进程运行,仅当第一队列空闲时才调度第二队列进程执行。若优先级低队列执行中有优先级高队列进程执行,应立刻将此进程放入队列末尾,把处理机分配给新到高优先级进程。


(七)操作系统的内存管理机制


操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),操作系统中内存的分配可以简单分为连续分配和非连续分配:


连续分配为用户分配一个连续的内存空间,可以将一个进程分散的装入内存分区。常见的如块式管理。


非连续分配根据分区的大小是否固定可以分成分页存储管理(固定)与分段存储管理(不固定),为了避免两者的缺点,还可以二者混用成段页式存储管理。


页式管理:把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。


段式管理:段式管理在页式管理的基础上,将内存划分为更小的段,段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多 。但是,最重要的是段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。


段页式管理:段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存先分成若干段,每个段又分成若干页,也就是说 段页式管理机制 中段与段之间以及段的内部的都是离散的


分页和分段的区别: 1、页是信息的物理单位,分页的主要目的是为了实现离散分配,提高内存的利用率。分页仅仅是系统管理上的需求,安全是系统行为对用户是不可见的;


段是信息的逻辑单位,分段的主要目的是更好地满足用户需求,一个段通常包含一组数语一个逻辑板块的信息。分段是用户可见的,用户编程时需要显示的给出段名。


2、页的大小是固定的,系统决定;段的大小是不固定的,取决于系统程序


3、分页的用户地址空间是一维的,程序员只需要给出一个记忆符就可以表示一个地址,分段存储管理的地址空间是二维的,程序员需要在标识一个地址的时候,既要给出段名,也要给出段内地址


4、分段比分页更容易实现信息的共享和保护 注意:不能修改的代码称为纯代码(可重入代码),这样的代码段不是临界资源,可以共享。可修改的代码是不可以共享的(比如由很多变量的代码段) 比如:生产者进程的一个进程段,是用来判断该缓冲区此时是否可以访问,这个时候消费者进程的段表项也可以指向这里 为什么分业管理不方便实现代码共享? 因为将生产者进程分段,由于页面的空间有限,一段可能被装入多个空间,一个空间也可能有多个代码段被装进来,所以适合共享,达不到安全的效果


5、分页:内存空间利用率高,不会产生外部碎片,只有少量的内部碎片;不方便按照逻辑模块实现信息的共享与保护


分段:方便按照逻辑模块实现信息的共享与保护;如果段太长,为其分配很大的存储空间很不方便,容易产生外部碎片(这个虽然可以用前面的一些紧凑技术解决一部分,但是时间代价很大)


(八)什么是虚拟内存


虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。


虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。这样会更加有效地管理内存并减少出错。


(九)页面置换算法


在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。


常见的页面置换算法有如下几种:


OPT页面置换算法: 这种算法选择永不使用或者最长时间内不会被访问的页面进行替换,但是现在无法预知哪个页面在未来是最长时间内不会被访问的,因此这种算法只能算作理论上。FIFO页面置换算法:先进先出,淘汰最先进入内存的页面。LRU(Least Currently Used)页面置换算法:最近最久未使用,淘汰最近最久未使用的页面。LFU(Least Frequently Used)页面置换算法:最少使用页面置换算法,淘汰之前使用时间中使用最少的页面。


这篇文章我会持续更新,有任何错误指出或者更多相关知识推荐欢迎在评论区留言,我是鱼仔,我们下期再见!



相关文章
|
1月前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
62 9
|
4月前
|
存储 算法 Java
惊!Java程序员必看:JVM调优揭秘,堆溢出、栈溢出如何巧妙化解?
【8月更文挑战第29天】在Java领域,JVM是代码运行的基础,但需适当调优以发挥最佳性能。本文探讨了JVM中常见的堆溢出和栈溢出问题及其解决方法。堆溢出发生在堆空间不足时,可通过增加堆空间、优化代码及释放对象解决;栈溢出则因递归调用过深或线程过多引起,调整栈大小、优化算法和使用线程池可有效应对。通过合理配置和调优JVM,可确保Java应用稳定高效运行。
148 4
|
4月前
|
Java 程序员
Java数据类型:为什么程序员都爱它?
Java数据类型:为什么程序员都爱它?
55 1
|
1月前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
1月前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
2月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
24 5
|
2月前
|
Java 大数据 程序员
我的程序员之路:自学Java篇
我的程序员之路:自学Java篇
|
1月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
54 0
Vanilla OS:下一代安全 Linux 发行版
|
26天前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
52 4
|
1月前
|
人工智能 安全 Linux