第一二章学习笔记
第一章
第一章向我们介绍了本书的学习目标以及一些基本概念,和Linux的简单操作,但是对于基础的概念解析较少,于是我用GPT了解了一下
进程概念和进程管理
进程是计算机科学中的重要概念,它是正在运行的程序的实例。每个进程都有自己的内存空间、代码、数据和系统资源,它们在操作系统中独立运行,彼此之间通常是隔离的。以下是关于进程的一些重要概念和进程管理的要点:
-
进程的特征:
- 独立性:每个进程都是独立运行的,互不干扰。
- 资源隔离:进程拥有自己的内存和资源,不共享除非明确要求。
- 并发执行:多个进程可以同时运行,实现并发处理。
- 程序实例:进程是程序的实例,每个进程对应一个正在运行的程序。
-
进程状态:
- 就绪:进程已准备好执行,等待分配CPU时间。
- 运行:进程正在CPU上执行。
- 阻塞:进程暂时停止执行,等待某个事件的发生(例如,等待I/O完成)。
- 终止:进程已经执行完毕或被终止,等待被回收。
-
进程管理任务:
- 创建进程:操作系统可以创建新的进程,通常通过复制父进程的内容来创建子进程。
- 调度进程:操作系统负责决定哪个进程在什么时候运行,以实现公平分配CPU时间。
- 进程通信:进程之间可以通过进程间通信(IPC)机制来交换信息和数据。
- 终止进程:操作系统可以终止进程,释放其资源。
- 进程状态管理:跟踪和维护进程的状态,以确保它们能够正确运行。
-
进程控制块(PCB):每个进程都有一个关联的数据结构,称为进程控制块。PCB包含了关于进程的重要信息,如进程状态、寄存器值、程序计数器、内存分配信息、打开文件列表等。
-
进程调度:操作系统使用调度算法来决定哪个进程在什么时候获得CPU时间。这可以根据优先级、时间片轮转、先来先服务等策略来完成。
-
多进程与多线程:多进程和多线程是实现并发性的两种常见方式。多进程更重,因为每个进程都有自己的独立内存空间,但线程共享相同的内存空间,因此更轻量级。不同的应用场景可能更适合使用其中一种。
进程管理是操作系统的核心功能之一,它确保计算机上的多个程序能够同时运行,并在需要时有效地协同工作。进程管理有助于资源的合理利用,提高了系统的效率和可靠性。
并发编程
并发编程是一种编程方式,用于处理多个任务同时执行的情况,以提高程序的性能和效率。在并发编程中,多个任务可以同时执行,而不必等待其他任务完成。这对于需要处理大量I/O操作、多核处理器的利用、实时系统等场景非常重要。以下是并发编程的一些关键概念和技术:
-
线程和进程:
- 线程:线程是程序执行的最小单位,多个线程可以在同一进程内并发执行。它们共享进程的内存空间,因此可以方便地共享数据和资源。
- 进程:进程是程序的实例,每个进程都有自己独立的内存空间和资源。多个进程可以在操作系统级别并发执行。
-
共享内存和消息传递:
- 共享内存:多个线程或进程可以通过共享内存来共享数据,这使它们可以直接读取和写入相同的内存位置。但需要小心处理并发访问的同步问题。
- 消息传递:线程或进程之间可以通过消息传递机制来通信,将消息发送到接收者并等待响应。这种方式更安全,因为数据不会直接共享,但会引入一些开销。
-
同步和互斥:
- 同步:同步是一种控制多个线程或进程的执行顺序和协作的机制,以避免竞态条件和不确定性行为。
- 互斥:互斥是一种同步技术,用于确保在任何给定时刻只有一个线程或进程能够访问共享资源。通常使用互斥锁、信号量等来实现。
-
并发模型:
- 多线程并发:使用多线程编程模型时,多个线程在同一进程内并发执行。Java、Python、C++等编程语言提供了多线程支持。
- 多进程并发:使用多进程编程模型时,多个进程在操作系统级别并发执行。Python的
multiprocessing
模块可以用于多进程编程。 - Actor模型:Actor模型是一种并发编程模型,其中的"actors"(类似于独立的并发实体)通过消息传递相互通信,而不共享状态。Erlang语言使用了这个模型。
-
死锁和竞态条件:并发编程中常见的问题包括死锁(多个线程或进程互相等待对方释放资源)和竞态条件(多个线程或进程同时访问和修改共享资源时可能导致不确定性行为)。必须小心设计和同步来避免这些问题。
-
线程池和并发工具:为了更有效地管理线程,可以使用线程池和各种并发工具,如计数器、信号量、阻塞队列等,来协调和管理并发任务的执行。
并发编程是复杂的,因为它引入了许多潜在的问题,如竞态条件和死锁。因此,在编写并发代码时,需要谨慎考虑并发问题,并使用适当的同步和控制机制来确保程序的正确性和稳定性。
TCP/IP和网络编程
TCP/IP是一种用于计算机网络通信的协议套件,它包括传输控制协议(TCP)和互联网协议(IP),用于实现数据在网络中的传输和路由。网络编程是使用这些协议来创建网络应用程序的过程,这些应用程序可以在网络上发送和接收数据。以下是关于TCP/IP网络编程的一些关键概念和步骤:
-
Socket编程:
- 在TCP/IP网络编程中,通信的基本单位是套接字(Socket)。套接字是一种用于在网络上进行通信的编程接口,它允许应用程序创建、发送和接收数据。
-
客户端和服务器:
- 网络应用程序通常分为客户端和服务器两部分。
- 客户端:客户端应用程序发送请求到服务器,并接收服务器的响应。它通常主动发起连接。
- 服务器:服务器应用程序监听来自客户端的连接请求,并响应这些请求。它被 passively 侦听并处理连接。
-
TCP连接:
- TCP是一种可靠的协议,它提供面向连接的通信。在网络编程中,使用TCP套接字来建立可靠的连接。
- 客户端和服务器分别创建自己的套接字,并通过 IP 地址和端口号来识别对方。客户端发起连接请求,服务器接受连接。
- 一旦建立连接,客户端和服务器可以通过套接字进行数据传输。
-
IP地址和端口号:
- IP地址用于标识网络中的主机,而端口号用于标识主机上运行的不同应用程序或服务。
- IP地址通常是IPv4或IPv6格式的,例如,IPv4地址是如 "192.168.1.1" 这样的格式。
- 端口号是一个整数,通常在范围0到65535之间。0到1023的端口号是预留给系统和常用服务的。
-
编程语言和库:
- 不同的编程语言提供了用于网络编程的库和工具。例如,Python有
socket
库,Java有java.net
包,C/C++有sockets
库等。 - 这些库允许开发人员创建套接字、建立连接、发送和接收数据,以及处理网络通信中的各种任务。
- 不同的编程语言提供了用于网络编程的库和工具。例如,Python有
-
错误处理和异常处理:
- 在网络编程中,网络连接可能会发生错误,如连接超时、连接中断、数据包丢失等。
- 开发人员需要编写适当的错误处理和异常处理代码,以确保应用程序能够在不稳定的网络环境中正确运行。
-
安全性和加密:
- 在网络通信中,数据的安全性是一个关键问题。敏感数据通常需要加密,以防止中间人攻击和数据泄露。
- 使用安全套接字层(SSL)或传输层安全性协议(TLS)等协议来加密数据传输。
网络编程是一个广泛的领域,涵盖了各种应用程序类型,包括Web应用程序、游戏服务器、聊天应用程序、文件传输和远程控制等。了解TCP/IP协议和套接字编程是开发网络应用程序的关键,它们允许开发人员实现数据通信和交互。
信号、信号处理和进程间通信
信号、信号处理和进程间通信是操作系统和多进程编程中的重要概念。让我们分别介绍它们:
-
信号(Signal):
- 信号是一种异步通知机制,用于在操作系统中处理各种事件和异常情况。它们是操作系统向进程发送的小型消息。
- 信号可以由操作系统本身、其他进程或进程自身生成。例如,Ctrl+C键盘组合键会向前台进程发送中断信号(SIGINT)。
- 常见的信号包括SIGINT(中断)、SIGTERM(终止)、SIGKILL(强制终止)等。
- 进程可以注册信号处理函数,以便在接收到信号时采取特定的操作。默认情况下,某些信号会导致进程终止,但可以通过信号处理函数来更改其行为。
-
信号处理(Signal Handling):
- 信号处理是指为进程中的特定信号定义处理程序的过程。处理程序是一段代码,用于指定在接收到信号时要采取的操作。
- 在大多数编程语言中,可以使用信号处理函数来捕获和处理信号。例如,在C语言中,可以使用
signal
函数来注册信号处理函数。 - 信号处理程序可以执行各种操作,如记录日志、清理资源、重新启动进程等,具体取决于信号的类型和应用程序的需求。
-
进程间通信(Inter-Process Communication, IPC):
- 进程间通信是不同进程之间交换数据和信息的机制。在多任务操作系统中,多个进程可能需要协同工作或共享数据。
- 常见的IPC机制包括管道、套接字、消息队列、共享内存和信号量等。
- 信号可以用于简单的进程间通信,例如,一个进程可以向另一个进程发送信号来触发某些操作。
- 更复杂的IPC机制允许进程直接交换数据,共享资源或通过消息传递进行通信。
总之,信号是一种用于通知进程事件和异常情况的机制,信号处理允许进程在接收到信号时采取特定的操作。而进程间通信是一种机制,允许不同进程之间交换数据和信息,以实现协同工作和共享资源的目的。这些概念对于多任务编程和操作系统编程非常重要。
文件系统
文件系统是计算机系统中用于组织和管理数据存储的关键组成部分。它提供了一种层次结构的方法来存储、检索和管理文件和目录,使用户和应用程序能够有效地访问和操作数据。以下是文件系统的主要概念和功能:
-
文件(File):
- 文件是数据的基本单位,可以是文本文件、图像、音频、视频等各种类型的数据。
- 每个文件都有一个唯一的名称(文件名)和相关的元数据,如文件大小、创建时间、修改时间等。
-
目录(Directory):
- 目录是一种特殊类型的文件,用于组织和存储其他文件和子目录。
- 目录可以形成层次结构,允许用户创建文件夹以更好地组织和分类文件。
-
路径(Path):
- 路径是描述文件或目录位置的字符串,它从根目录开始一直到目标文件或目录。
- 绝对路径从根目录开始,相对路径从当前工作目录开始。
-
文件系统层次结构(File System Hierarchy):
- 大多数操作系统使用树形结构来组织文件系统,其中根目录是顶级目录,下面可以有多个子目录和文件。
- 不同的操作系统具有不同的文件系统层次结构,例如,Linux系统使用的是类似于"/"的根目录,而Windows系统使用的是类似于"C:"的根目录。
-
文件权限(File Permissions):
- 文件系统通常提供了对文件和目录的访问控制,这些权限规定了哪些用户或进程可以读取、写入或执行文件。
- 常见的文件权限包括读(read)、写(write)、执行(execute)权限。
-
文件操作(File Operations):
- 文件系统允许用户和应用程序执行各种操作,如创建、复制、移动、删除文件和目录。
- 文件系统还支持文件的打开、关闭、读取和写入等操作。
-
磁盘管理(Disk Management):
- 文件系统负责在物理存储设备上管理数据的分布和存储。
- 这包括文件的存储分配、磁盘空间的管理、文件的分散存储以及磁盘碎片整理。
-
文件系统类型(File System Types):
- 不同的操作系统可以使用不同类型的文件系统,例如,Linux常用的文件系统包括EXT4、XFS、Btrfs,而Windows使用的是NTFS。
- 文件系统的选择取决于操作系统的需求和性能要求。
-
网络文件系统(Network File Systems):
- 文件系统还可以通过网络访问,允许用户从远程计算机访问文件和目录,这称为网络文件系统(NFS)或类似的协议。
文件系统是计算机操作系统的核心组件之一,它为用户和应用程序提供了一种方便的方式来管理和操作数据。不同的操作系统和文件系统类型可能具有不同的特性和功能,但它们的基本目标都是提供高效、可靠和安全的数据存储和访问机制。
第二章
第二章主要介绍了文本编辑器的使用、程序开发、C语言中的函数调用、C语言程序与汇编代码的链接、链接库、Makefile、GBD、以及大二是数据结构学的结构体、链表、树等知识
自学总结
EMACS
下载完后第一次使用
数据结构课程学过的知识再次不再赘述,直接去找GPT玩——苏格拉底挑战
最终评价
学习过程中遇到的问题
虚拟机太久不用不能正常启动
首先向GPT问了一下,但是它给出的方法似乎并不奏效
于是去CSDN上找大佬文章参考了一下,解决方法参考链接: 这里参考了方法一
我在网上找到的GPT是API模型,对于API模型到底是什么的问题,我还有些不清楚,于是我也请教了gpt
总结
本次学习主要学了课本一二章,第一章是对本书学习的总体介绍,第二章是一些编程背景,其中很多都是大二学过的课程,其他的老师在课上也有演示,跟着GPT的指引EMACS下载也很简单,整体是一次不难但是收获满满的学习,本次学习共与GPT对话58次,多数是有效问答,但是也有少数“人工智障”的情况,我让他向我提问它可能还反问我的问题是什么,一是说明我用的这个版本不够先进,另外也说明我的promote技巧需要提升。