一些零散的概念

本文详细阐述了进程和线程的概念及其区别,包括资源分配、调度机制、创建方式及开销等方面的内容。此外还介绍了死锁现象及其处理方法,进程的各种状态,以及进程间通信的不同方式。
  • 进程和线程的区别?

    • 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元(两个角度
    • 同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程(资源共享
    • 进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束(创建方式
    • 线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的(开销
    • 线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
    • 线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
  • 死锁?死锁产生的原因?死锁的必要条件?怎么处理死锁?

    • 死锁:相互等待资源而产生的一种僵持状态,如果没有外力的干预将一直持续这个状态
    • 原因:系统资源不足、相互竞争资源、请求资源顺序不当
    • 必要条件:互斥、不可抢占、循环等待、请求与保持
    • 处理:因为互斥是不可改变的,所以只能破坏其他三个条件中的一个来解除死锁,方法:剥夺资源、杀死其中一个线程
  • 进程的几种状态?

    • run(运行状态):正在运行的进程或在等待队列中对待的进程,等待的进程只要以得到cpu就可以运行
    • Sleep(可中断休眠状态):相当于阻塞或在等待的状态
    • D(不可中断休眠状态):在磁盘上的进程
    • T(停止状态):这中状态无法直观的看见,因为是进程停止后就释放了资源,所以不会留在linux中
    • Z(僵尸状态):子进程先与父进程结束,但父进程没有调用wait或waitpid来回收子进程的资源,所以子进程就成了僵尸进程,如果父进程结束后任然没有回收子进程的资源,那么1号进程将回收
  • IPC通信方式?

    • 管道(匿名管道(pipe亲缘关系的进程通信)、命名管道(mkfifo/mknod))

    • 消息队列:是基于消息的、用无亲缘关系的进程间通信,主要函数:msgget、msgsend、msgrecv、msgctl

    • 信号量:相当于一把互斥锁,通过p、v操作,主要函数:semget、semop、semctl

    • 共享内存:是进程间通信速度最快的,所以用经常是集合信号量或互斥锁来实现同步,shmget、shmat、shmdt、shmctl

  • 什么是虚拟内存?

    是将进程部分装入内存中,从而能实现一个很大的程序能在一个比它小的内存中运行,它的主要实现是靠程序的换进换出来实现的,因为内存中0~3G是用户使用,3~4G才是内存使用,通过映射来实现来进行逻辑地址到物理地址的映射

  • 虚拟地址、逻辑地址、线性地址、物理地址的区别?

    • 分段机制把一个逻辑地址转换为线性地址;接着,分页机制把一个线性地址转换为物理地址。
    • 虚拟地址:虚拟内存映射出来的地址
    • 逻辑地址:程序的段加偏移量形成的,C/C++程序中取地址求出来的地址就是逻辑地址
    • 线性地址:是逻辑地址到物理地址的中间层,只有启动分页机制的时候才有线性地址,如果没有分页机制,那么线性地址就是物理地址
    • 物理地址:是内存中实实在在存在的硬件地址,
    • 逻辑地址(启动分段)-> 线性地址(启动分页)-> 物理地址

转载链接

【从高压输电线的架空地线中汲取电能】一个25千瓦受控电源从735千伏线路的架空地线中汲取电能的SimPowerSystems模型(Simulink仿真实现)内容概要:本文介绍了一个基于SimPowerSystems的Simulink仿真模型,用于模拟从735千伏高压输电线的架空地线中汲取25千瓦电能的受控电源系统。该模型聚焦于高压输电线路中架空地线的能量回收技术,通过仿真手段实现对电能采集过程的建模与控制策略验证,体现了电力系统中新型能源获取方式的技术可行性与工程应用潜力。文中还提及该资源属于一系列电力系统仿真研究的一部分,涵盖微电网、储能优化、碳流追踪、鲁棒调度等多个前沿方向,配套提供Matlab/Simulink代码及网盘资料链接,便于科研人员复现与拓展研究。; 适合人群:具备电力系统基础知识、熟悉Matlab/Simulink仿真环境,从事电力工程、能源回收或智能电网相关研究的科研人员及研究生;有一定编程与建模仿真经验的高年级本科生或工程技术人员。; 使用场景及目标:①研究高压输电线路中架空地线的能量回收机制与建模方法;②掌握基于Simulink的电力系统仿真技术,特别是受控电源与电网交互的动态特性分析;③为开展能源 harvesting、分布式供能、电力电子变换器控制等相关课题提供参考模型与技术支撑; 阅读建议:建议结合提供的仿真模型文件进行实操演练,重点理解系统结构设计、参数设置与控制逻辑实现;同时可延伸学习文档中提到的其他电力系统优化与仿真案例,以拓宽研究视野技术积累。
### 概念 Stream 流是 Java 8 中引入的一个全新概念,用于解决已有集合类库既有的一些弊端。它允许以声明式的方式处理数据集合,可看作是遍历数据集的高级迭代器。Stream 流自己不会存储元素,也不会改变源对象,只是对数据源进行操作。其操作是惰性求值的,即在调用终端操作之前,中间操作不会立即执行,这意味着可以构建一个操作序列,然后在需要时一次性执行,以减少不必要的计算。此外,Stream API 基于函数式编程的理念,提供了丰富的中间操作终端操作,可通过函数式接口来实现自定义操作。Stream 与 Lambda 表达式、方法引用结合紧密,让代码更简洁、可读性更强,还能充分利用多核架构进行并行处理 [^1][^2][^3][^4]。 ### 用法 #### 创建 Stream 流 - **通过集合创建**:可以使用集合的 `stream()` 方法创建顺序流,使用 `parallelStream()` 方法创建并行流。 ```java import java.util.Arrays; import java.util.List; public class StreamCreation { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 创建顺序流 java.util.stream.Stream<Integer> sequentialStream = numbers.stream(); // 创建并行流 java.util.stream.Stream<Integer> parallelStream = numbers.parallelStream(); } } ``` - **通过数组创建**:使用 `Arrays.stream()` 方法。 ```java import java.util.Arrays; public class StreamFromArray { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5}; java.util.stream.IntStream stream = Arrays.stream(array); } } ``` - **使用 `Stream.of()` 方法**:可以将零散的数据转换为 Stream 流 [^5]。 ```java import java.util.stream.Stream; public class StreamOfExample { public static void main(String[] args) { Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5); Stream<String> stringStream = Stream.of("ab", "cd", "ef"); } } ``` #### 中间操作 中间操作会返回一个新的 Stream 流,常见的中间操作有: - **`filter()`**:用于过滤元素,只保留满足条件的元素。 ```java import java.util.Arrays; import java.util.List; public class FilterExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .filter(n -> n % 2 == 0) .forEach(System.out::println); } } ``` - **`map()`**:用于元素转换,将每个元素映射为另一个元素。 ```java import java.util.Arrays; import java.util.List; public class MapExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .map(n -> n * 2) .forEach(System.out::println); } } ``` - **`sorted()`**:用于排序元素。 ```java import java.util.Arrays; import java.util.List; public class SortedExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2); numbers.stream() .sorted() .forEach(System.out::println); } } ``` #### 终端操作 终端操作会触发中间操作的执行,并产生一个最终结果,常见的终端操作有: - **`forEach()`**:用于遍历元素。 ```java import java.util.Arrays; import java.util.List; public class ForEachExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .forEach(System.out::println); } } ``` - **`collect()`**:用于收集元素到集合。 ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class CollectExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); } } ``` - **`count()`**:用于统计元素数量。 ```java import java.util.Arrays; import java.util.List; public class CountExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); long count = numbers.stream() .filter(n -> n % 2 == 0) .count(); System.out.println(count); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值